<script>
  Function.prototype.myBind = function (context) {
    // 判断调用者是不是函数
    if (typeof this !== 'function') {
      throw new TypeError('Error')
    }
    // 截取传递的参数
    const args = Array.from(arguments).slice(1)
    // _this指向调用的函数
    const _this = this
    return function F() {
      // 因为返回一个函数 我们可以new F()所以需要判断
      // 对于new的情况来说，不会被任何方式改变this
      if (this instanceof F) {
        return new _this(...args, ...arguments)
      } else {
        return _this.apply(context,args,args.concat(...arguments))
      }
    }
  }
  // function print () {
  //   console.log(this.name)
  // }
  // var obj = {
  //   name: '小鹿'
  // }
  // let F = print.myBind(obj,1,2,3)
  // let obj1 = new F()
  // console.log(obj1())
  // function fn () {
  //   console.log(this, this.name)
  //   console.log(arguments)
  // }
  let obj = {
    name: 'ceee'
  }
  var fn = new Function('console.log(this, this.name)')
  console.log(fn)
  fn()
  // var fn1 = fn.call(obj, 1,2,3)
  // console.log(fn1)


  // 实现 new 
  // new 先创建了一个新的对象 
  // 这个对象会被执行[[Prototype]]（也就是__proto__）链接
  // 生成的新对象会绑定到函数调用的this
  // 把[[Prototype]]连接到函数的prototype上
  // 返回值 如果是object就返回object 否则就返回对象本身
  console.log('-------------------------')
  function createNew (Con, ...args) {
    let obj = {}
    Object.setPrototypeOf(obj, Con.prototype)
    let result = Con.apply(obj, args) // call apply返回值是函数的返回值
    return result instanceof Object ? result : obj
  }
function Test(name, age) {
  this.name = name
  this.age = age
  // return {name: '123', age: '1231'}
}
Test.prototype.sayName = function () {
    console.log(this.name)
}
const a = createNew(Test, 'yck', 26)
console.log(a.name) // 'yck'
console.log(a.age) // 26
a.sayName() // 'yck'
console.log('----------')
function way(n) {
  if (n === 1 || n=== 2) {
    return n
  } else {
    return way(n-1)+way(n-2)
  }
}
var b = way(10)
console.log(b)
// console.log(b)
// function way(n){
//     if(n == 1){
//         return 1;
//     }else if(n==2){
//         return 2;
//     }else{
//         return way(n-1)+way(n-2)
//     }
// }
// var a = way(3);

</script>